iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
自我挑戰組

laravel+vue 學習系列 第 13

Day13. Laravel 資料庫與 Eloquent 之一

  • 分享至 

  • xImage
  •  

一、設置資料庫

  1. 位置: config/database.php
  2. 資料庫連結: 在檔案預設每個 driver(mysql, pgsql...) 都會有一個連結, 連線吃料庫名稱、帳號密碼可於 .env 下設定
  3. 開發人員可在 app 環境內切換使用的連線
    $product = DB::connection('cache_mysql_db')->select('select * fomr product');

二、migration

  1. 一種檔案定義遷移時要做的動作, 內容主要有兩個 function, up() 和 down()
    • migration 檔案命名方式 e.g. 2022_08_20_000000_create_product.table.php
    • up() 方法: 在執行新的 migration 檔案時, 會跑這裡面程式去新增或調整資料表架構或內容
    • down() 方法: 常見情況是當在執行回復的時候跑與 up() 相反的動作, e.g. 刪除資料表、將修改的欄位狀態復原
  2. 利用 artisan 建立 migration
    php artisan make:migration create_product_table
* 旗標 --create: 設定 migration 要操作的資料表
* 旗標 --table: 常在要新增欄位或修改欄位屬性時, 給予指定的資料表名稱
  1. 建立資料表, 使用 Schema 靜態介面與方法
    # 到建立好的 2022_08_20_000000_create_product.table.php 檔案內
    # Blueprint 類別提供各種欄位建立的方法
    Schema::create('product', function (Blueprint $table) {
        // ...執行建立資料
        $table->string('name', 255);
        $table->timestamp('start_date');
        // ...
    });
  1. 利用流暢方式建立欄位屬性
    Schema::create('product', function (Blueprint $table) {
        // ...執行建立資料
        // 設定商品名稱為唯一直
        $table->string('name', 255)->unique();
        $table->timestamp('start_date');
        // 設定欄位 modify_date 在欄位 start_date 之後
        $table->timestamp('modify_date')->after('start_date);
        // ...
    });
  1. 卸除資料表, 預設在新建時會放在 down() 方法中
    Schema::dropIfExists('product');
  1. 修改欄位, 再用設定欄位方法後, 接 change() 即可修改欄位
    Schema::tabel('product', function(Blueprint $table){
        # 修改欄位長度
        $table->string('name', 100)->change();
        
        # 修改欄位名稱
        $table->renameColumn('cloumn1', 'cloumn_1');
        
        # 移除欄位
        # 在 down() 裡面應須新增欄位
        $table->dropColumn('votes');
    });
  1. 索引、外鍵
    • 新增索引
        # 新建單一主鍵
        $table->primary('p_id');
        # 新建複合組鍵
        $table->primary(['p_id', 'p_num']);
    
        # 新增獨一無二索引
        $table->unique('email');
        # 新增複合獨一無二索引
        $table->unique('email', 'custom_name');
    
        # 新增基本索引
        $table->index('account');
        # 新增複合基本索引
        $table->index('account', 'account_mail');
    
    • 移除欄位
        $table->dropPrimary('p_id');
        $table->dropUnique('email');
        $table->dropIndex('account');
    
    • 添加、移除外鍵
        # 新增外鍵
        $table->foreign('category_id')->reference('id')->on('categoty');
    
        # 移除外鍵
        $table->foreign('categoru_id')->reference('id')->onDelete('category');
    
  2. artisan 執行 migration
    php artisan migration
* 執行後會檢查之前 migration 紀錄, 將執行新建的 migration 檔案
* 有其他選項 refresh、fresh、rollback 等操作回復資料庫

三、Seeding

  1. artisan 建立 seeder
    php artisan make:seeder ProductsTableSeeder
  1. 在 database/seeders/DatabaseSeeder.php 內 run() 方法執行 seeder
    public function run(){
        $this->call(ProductsTableSeeder::class);
        
        # 使用靜態介面
        DB::table('product')->insert([
            // ...
        ]);
    }
  1. model 工廠

    • 預設工廠名稱由 Eloquent 名稱命名, 也可以另外定義
        # 使用 Eloquent 名稱
        $factory->define(Product::class, function(Faker\Generator $faker) {
            return [
                'name' => $faker->name
            ];
        }
    
        # 使用自訂名稱
        $factory->define('product', function(Faker\Generator $faker) {
            return [
                'name' => $faker->name
            ];
        }
    
    • 建立 model 工廠

      5.4 之前 model 工廠都要在 database/factories/ModelFactory.php 建立
      5.5 之後可在自己的 Class 定義

        php artisan make:factory ProductFactory
    
    • 使用 factory
        # 建立多筆資料
        $product = factory(Product::class, 20)->create();
    
    • 覆寫欄位
        factory(Product::class, 20)->create()->each(function($product) use ($post) {
            $post->comments()->save(factory(Comment::class)->make(
                [
                    'user_id' => $u->id
                ]
            );
        }
    
    • state 修改資料欄位狀態, e.g. 是否為特價商品

查詢建構器

  • Laravel 提供查詢建構器介面, 與不同資料庫間進行互動
  1. DB 靜態介面
    # 使用原始 SQL
    DB::statement('select * from product');
    
    # 原始 select
    DB::selete('select * from product');
    
    # PDO 資料綁定
    DB::select('select * from product where category = ?'. [2]);
    
    # insert
    DB::insert('insert into product ('name', 'price') values (?, ?)', [
        'test', '100'
    ]);
  1. 串接查詢建構式
    • 限制方法: 可以過濾排除不符合的資料, 減少資料回傳數量
      • select(), where(), orWHere(), whereBetween(), whereIn() ...
    • 修改方法: 會改變結果輸出的方式, 但不會限制回傳
      • orderBy(), groupBy(), having(), havingRaw(), skip(), take() ...
    • 條件方法: Laravel 5.2 之後可根據 boolean 判斷是否要加入查詢條件
      • when(), unless()
    • 結束回傳語法: 上述的方法都是設定條件, 尚未實際執行查詢, 當使用回傳語法時會正式到資料查詢
      • get(), first(), firstOrFail(), value() ...
  2. 交易
    • 包覆在交易中的內容只會有全部執行與全部不執行兩種狀況, 當發生錯誤時會 rollback
    • DB::beginTransaction() 開始交易
    • DB::commit() 當交易無發生錯誤時提交交易
    • DB::rollBack() 當發生錯務實恢復到交易前的狀態

上一篇
Day12. 容器 Container
下一篇
Day14. Laravel 資料庫與 Eloquent 之二
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言